home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sounds Terrific 2
/
Sounds Terrific II (1996)(Weird Science)(Disc 1 of 2)[Amiga-PC].iso
/
archives
/
amiga
/
tracker_4_31.lzh
/
tracker
/
split.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-15
|
3KB
|
171 lines
/* split.c
vi:ts=3 sw=3:
*/
/* $Id: split.c,v 4.15 1995/05/15 12:20:07 espie Exp espie $
* $Log: split.c,v $
* Revision 4.15 1995/05/15 12:20:07 espie
* *** empty log message ***
*
* Revision 4.14 1995/05/12 13:53:34 espie
* New synchronization.
*
* Revision 4.13 1995/04/22 17:50:27 espie
* *** empty log message ***
*
* Revision 4.12 1995/02/21 17:54:32 espie
* Internal problem: buggy RCS. Fixed logs.
*
* Revision 4.0 1994/01/11 17:56:24 espie
* Cleaner.
* run_in_fg() and create_notes_table() not needed !
* Use new pref scheme.
*/
#include <signal.h>
#include "defs.h"
#include "song.h"
#include "extern.h"
#include "getoption.h"
ID("$Id: split.c,v 4.15 1995/05/15 12:20:07 espie Exp espie $")
/* global variable to catch various types of errors
* and achieve the desired flow of control
*/
int error;
LOCAL struct song *do_scan_song(name, type)
char *name;
int type;
{
struct song *song;
struct exfile *file;
file = open_file(name, "r", getenv("MODPATH"));
if (!file)
return NULL;
song = read_song(file, type);
close_file(file);
return song;
}
#define CHUNK_SIZE 32000
LOCAL char *suffix[] =
{
"lzh", "lha", "Z", "z", "shn", "zoo", 0
};
LOCAL void truncate(name)
char *name;
{
int i;
int last_point = 0;
for (i = 0; name[i]; i++)
{
if (name[i] == '.')
last_point = i + 1;
}
if (last_point)
{
for (i = 0; suffix[i]; i++)
if (strcmp(name + last_point, suffix[i]) == 0)
{
name[last_point - 1] = 0;
return;
}
}
}
void split_module(name, cutpoint)
char *name;
long cutpoint;
{
char buffer[300];
FILE *mod;
FILE *samp;
struct exfile *file;
char *copy_buff;
int chunk;
file = open_file(name, "r", getenv("MODPATH"));
truncate(name);
sprintf(buffer, "%s.mod", name);
mod = fopen(buffer, "w");
if (!mod)
exit(10);
sprintf(buffer, "%s.samp", name);
samp = fopen(buffer, "w");
if (!samp)
exit(10);
copy_buff = malloc(CHUNK_SIZE);
if (!copy_buff)
exit(10);
while(cutpoint >= CHUNK_SIZE)
{
read_file(copy_buff, 1, CHUNK_SIZE, file);
fwrite(copy_buff, 1, CHUNK_SIZE, mod);
cutpoint -= CHUNK_SIZE;
}
if (cutpoint > 0)
{
read_file(copy_buff, 1, cutpoint, file);
fwrite(copy_buff, 1, cutpoint, mod);
}
fclose(mod);
while ((chunk = read_file(copy_buff, 1, CHUNK_SIZE, file)) > 0)
fwrite(copy_buff, 1, chunk, samp);
fclose(samp);
close_file(file);
}
int main(argc, argv)
int argc;
char **argv;
{
struct song *song;
int i;
int default_type;
default_type = BOTH;
for (i = 1; i < argc; i++)
{
song = do_scan_song(argv[i], NEW);
if (!song && error != NEXT_SONG)
song = do_scan_song(argv[i], OLD);
if (song)
{
dump_song(song);
split_module(argv[i], song->samples_start);
release_song(song);
}
}
return 0;
}
void sync_audio(f, p)
void (*f) P((GENERIC));
GENERIC p;
{
}
void audio_ui(c)
int c;
{
}